﻿using System;
using System.Collections.Generic;
using System.Text;

using Sinacor.Servico.Bovespa.Ordens.BusinessEntity;
using Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Request;
using Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Response;


namespace Sinacor.Servico.Bovespa.Ordens.Service.ServiceImplementation.Translator
{
    /// <summary>
    /// TODO: Classe aguardando especificacao oficial
    /// </summary>
    public class TranslateOrdemDigitacao : TranslateBaseDigitacao
    {
        /// <summary>
        /// Transforma uma instância de "DataContract.Request.OrdemDigitacao" em uma instância de "BusinessEntity.OrdemDigitacao"
        /// </summary>
        /// <param name="pRequest"></param>
        /// <returns></returns>
        public BusinessEntity.OrdemDigitacao ToEntity(DataContract.Request.InserirOrdemDigitacao pRequest)
        {
            BusinessEntity.OrdemDigitacao response = new BusinessEntity.OrdemDigitacao();
            base.ToEntity((DataContract.Request.BaseDigitacao)pRequest, (BusinessEntity.BaseDigitacao)response);

            response.ApelidoCliente = pRequest.ApelidoCliente;
            response.CodigoAgenteCustodia = pRequest.CodigoAgenteCustodia;
            response.CodigoCarteira = pRequest.CodigoCarteira;
            response.CodigoCliente = pRequest.CodigoCliente;
            response.CodigoClienteCustodia = pRequest.CodigoClienteCustodia;
            response.CodigoClienteLoteOrdem = pRequest.CodigoClienteLoteOrdem;
            response.CodigoOperadorCVM = pRequest.CodigoOperadorCVM;
            response.ControleInternoTipoDistribuicao = pRequest.ControleInternoTipoDistribuicao;
            response.ControleTipoDistribuicao = pRequest.ControleTipoDistribuicao;
            response.DataMovimento = pRequest.DataMovimento;
            response.DataOrdem = pRequest.DataOrdem;
            response.DigitoClienteCustodia = pRequest.DigitoClienteCustodia;
            response.DigitoVerificadorCliente = pRequest.DigitoVerificadorCliente;
            response.IndicadorNaoLiquidacao = pRequest.IndicadorNaoLiquidacao;
            response.IndicadorSistemaExterno = pRequest.IndicadorSistemaExterno;
            response.NomeClienteCompleto = pRequest.NomeClienteCompleto;
            response.NumeroOrdem = pRequest.NumeroOrdem;
            response.NumeroOrdemSubSequencia = pRequest.NumeroOrdemSubSequencia;
            response.NumeroSequenciaDigitacao = pRequest.NumeroSequenciaDigitacao;
            response.PercentualAcrescimo = pRequest.PercentualAcrescimo;
            response.PercentualDistribuido = pRequest.PercentualDistribuido;
            response.PrecoInformado = pRequest.PrecoInformado;
            response.QuantidadeDestinadaCliente = pRequest.QuantidadeDestinadaCliente;
            response.SituacaoCliente = pRequest.SituacaoCliente;
            response.TipoDistribuicao = (BusinessEntity.Enum.TipoDistribuicao?)pRequest.TipoDistribuicao;
            response.TipoLiquidacao = (BusinessEntity.Enum.TipoLiquidacaoDistribuicao?)pRequest.TipoLiquidacao;
            response.TipoOrdemDistribuicao = (BusinessEntity.Enum.TipoOrdemDistribuicao) pRequest.TipoOrdemDistribuicao;
            response.UtilizaContaInvestimento = pRequest.UtilizaContaInvestimento;
            response.ValorDolar = pRequest.ValorDolar;
          
          

            return response;
        }

        /// <summary>
        /// Transforma uma lista de "DataContract.Request.OrdemDigitacao" em uma lista de "BusinessEntity.OrdemDigitacao"
        /// </summary>
        /// <param name="pRequest"></param>
        /// <returns></returns>
        public List<BusinessEntity.OrdemDigitacao> ToEntity(List<DataContract.Request.InserirOrdemDigitacao> pRequest)
        {
            List<BusinessEntity.OrdemDigitacao> responseList = new List<BusinessEntity.OrdemDigitacao>();

            foreach (DataContract.Request.InserirOrdemDigitacao OrdemDigitacao in pRequest)
            {
                responseList.Add(this.ToEntity(OrdemDigitacao));
            }

            return responseList;
        }
        
        /// <summary>
        /// Transforma uma instância de "BusinessEntity.OrdemDigitacao" em uma instância de "DataContract.Request.OrdemDigitacao" 
        /// </summary>
        /// <param name="OrdemDigitacao"></param>
        /// <returns></returns>
        private DataContract.Response.OrdemDigitacaoResponse ToResponse(BusinessEntity.OrdemDigitacao ordemDigitacao)
        {
            DataContract.Response.OrdemDigitacaoResponse response = new DataContract.Response.OrdemDigitacaoResponse();
            base.ToResponse((BusinessEntity.BaseDigitacao)ordemDigitacao, (DataContract.Response.BaseDigitacao) response);

            response.CodigoOperadorCVM = ordemDigitacao.CodigoOperadorCVM;            
            response.ControleInternoTipoDistribuicao = ordemDigitacao.ControleInternoTipoDistribuicao;
            response.ControleTipoDistribuicao = ordemDigitacao.ControleTipoDistribuicao;
            response.DataOrdem = ordemDigitacao.DataOrdem;
            response.NomeClienteCompleto = ordemDigitacao.NomeClienteCompleto;
            response.NumeroOrdem = ordemDigitacao.NumeroOrdem;
            response.NumeroOrdemSubSequencia = ordemDigitacao.NumeroOrdemSubSequencia;
            response.TipoOrdemDistribuicao = (DataContract.Enum.TipoDistribuicao?) ordemDigitacao.TipoOrdemDistribuicao;

            return response;
        }
        
        /// <summary>
        /// Transforma uma lista de "BusinessEntity.OrdemDigitacao" em uma lista de "DataContract.Request.OrdemDigitacao" 
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>        
        public List<DataContract.Response.OrdemDigitacaoResponse> ToResponse(List<BusinessEntity.OrdemDigitacao> list)
        {
            List<DataContract.Response.OrdemDigitacaoResponse> responseList = new List<DataContract.Response.OrdemDigitacaoResponse>();

            foreach (BusinessEntity.OrdemDigitacao OrdemDigitacao in list)
            {
                responseList.Add(this.ToResponse(OrdemDigitacao));
            }

            return responseList;
        }

        /// <summary>
        /// Transforma um "DataContract.Request.OrdemDigitacao pRequest" em "BusinessEntity.Parameter.ConsultarOrdemDigitacao"
        /// </summary>
        /// <param name="pRequest"></param>
        /// <returns></returns>
        public BusinessEntity.Parameter.ConsultarOrdemDigitacao ToParameter(ConsultarOrdemDigitacao pConsultarOrdemDigitacao)
        {
            BusinessEntity.Parameter.ConsultarOrdemDigitacao param = new BusinessEntity.Parameter.ConsultarOrdemDigitacao();

            param.DataMovimento = pConsultarOrdemDigitacao.DataMovimento;
            param.NumeroOrdem = pConsultarOrdemDigitacao.NumeroOrdem;
            param.NumeroOrdemSubSequencia = pConsultarOrdemDigitacao.NumeroOrdemSubSequencia;

            return param;
        }


        /// <summary>
        /// Transforma um "DataContract.Request.ConsultarOrdemDistribuicaoOrdemLote pRequest" em "BusinessEntity.Parameter.ConsultarOrdemDistribuicaoOrdemLote"
        /// </summary>
        /// <param name="pRequest"></param>
        /// <returns></returns>
        public BusinessEntity.Parameter.ConsultarOrdemDistribuicaoOrdemLote ToParameter(ConsultarOrdemDistribuicaoOrdemLote pConsultarOrdemDigitacaoLote)
        {
            BusinessEntity.Parameter.ConsultarOrdemDistribuicaoOrdemLote param = new BusinessEntity.Parameter.ConsultarOrdemDistribuicaoOrdemLote();

            param.DataMovimento = pConsultarOrdemDigitacaoLote.DataMovimento;
            param.NumeroConjunto = pConsultarOrdemDigitacaoLote.NumeroConjunto;

            return param;
        }


        /*
        public BusinessEntity.Parameter.ConsultarOrdemDigitacao ToParameter(
            DataContract.Request.OrdemDigitacao pRequest
        )
        {

        }*/
    }
}
